﻿using University.Workshop.Business;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;
using University.Workshop.Model;
using System.Collections.ObjectModel;
using System.Windows.Forms;

namespace University.Workshop.Tests
{


    /// <summary>
    ///Se trata de una clase de prueba para BookingManagerTest y se pretende que
    ///contenga todas las pruebas unitarias BookingManagerTest.
    ///</summary>
    [TestClass()]
    public class BookingManagerTest
    {


        private TestContext testContextInstance;

        /// <summary>
        ///Obtiene o establece el contexto de la prueba que proporciona
        ///la información y funcionalidad para la ejecución de pruebas actual.
        ///</summary>
        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        #region Atributos de prueba adicionales
        // 
        //Puede utilizar los siguientes atributos adicionales mientras escribe sus pruebas:
        //
        //Use ClassInitialize para ejecutar código antes de ejecutar la primera prueba en la clase 
        //[ClassInitialize()]
        //public static void MyClassInitialize(TestContext testContext)
        //{
        //}
        //
        //Use ClassCleanup para ejecutar código después de haber ejecutado todas las pruebas en una clase
        //[ClassCleanup()]
        //public static void MyClassCleanup()
        //{
        //}
        //
        //Use TestInitialize para ejecutar código antes de ejecutar cada prueba
        //[TestInitialize()]
        //public void MyTestInitialize()
        //{
        //}
        //
        //Use TestCleanup para ejecutar código después de que se hayan ejecutado todas las pruebas
        //[TestCleanup()]
        //public void MyTestCleanup()
        //{
        //}
        //
        #endregion


        /// <summary>
        ///Una prueba de ValidDate
        ///</summary>
        [TestMethod()]
        public void ValidDateTest()
        {
            DateTime check = DateTime.Today; // TODO: Inicializar en un valor adecuado
            DateTime checkout = DateTime.Today; // TODO: Inicializar en un valor adecuado
            bool expected = false; // TODO: Inicializar en un valor adecuado
            bool actual;
            actual = BookingManager.ValidDate(check, checkout);
            Assert.AreEqual(expected, actual);
        }

        /// <summary>
        ///Una prueba de ValidDate
        ///</summary>
        [TestMethod()]
        public void ValidDateTest1()
        {
            DateTime check = new DateTime(2009, 04, 01); // TODO: Inicializar en un valor adecuado
            DateTime checkout = new DateTime(2009, 04, 01); // TODO: Inicializar en un valor adecuado
            bool expected = false; // TODO: Inicializar en un valor adecuado
            bool actual;
            actual = BookingManager.ValidDate(check, checkout);
            Assert.AreEqual(expected, actual);
        }

        /// <summary>
        ///Una prueba de ValidDate
        ///</summary>
        [TestMethod()]
        public void ValidDateTestTRUE()
        {
            DateTime check = new DateTime(2020, 04, 01); // TODO: Inicializar en un valor adecuado
            DateTime checkout = new DateTime(2020, 04, 04); // TODO: Inicializar en un valor adecuado
            bool expected = true; // TODO: Inicializar en un valor adecuado
            bool actual;
            actual = BookingManager.ValidDate(check, checkout);
            Assert.AreEqual(expected, actual);
        }

        /// <summary>
        ///Una prueba de ValidDate
        ///</summary>
        [TestMethod()]
        public void ValidDateTestTRUEWhenCheckOutYearIsBigger()
        {
            DateTime check = new DateTime(2020, 04, 01); // TODO: Inicializar en un valor adecuado
            DateTime checkout = new DateTime(2021, 04, 04); // TODO: Inicializar en un valor adecuado
            bool expected = true; // TODO: Inicializar en un valor adecuado
            bool actual;
            actual = BookingManager.ValidDate(check, checkout);
            Assert.AreEqual(expected, actual);
        }
        /// <summary>
        ///Una prueba de ValidDate
        ///</summary>
        [TestMethod()]
        public void ValidDateTestTRUEWhenCheckOutMonthIsBigger()
        {
            DateTime check = new DateTime(2020, 04, 01); // TODO: Inicializar en un valor adecuado
            DateTime checkout = new DateTime(2020, 05, 04); // TODO: Inicializar en un valor adecuado
            bool expected = true; // TODO: Inicializar en un valor adecuado
            bool actual;
            actual = BookingManager.ValidDate(check, checkout);
            Assert.AreEqual(expected, actual);
        }

        /// <summary>
        ///Una prueba de ValidDate
        ///</summary>
        [TestMethod()]
        public void ValidDateTestFALSEWhenCheckOutMonthIsSmaller()
        {
            DateTime check = new DateTime(2020, 04, 01); // TODO: Inicializar en un valor adecuado
            DateTime checkout = new DateTime(2020, 01, 04); // TODO: Inicializar en un valor adecuado
            bool expected = false; // TODO: Inicializar en un valor adecuado
            bool actual;
            actual = BookingManager.ValidDate(check, checkout);
            Assert.AreEqual(expected, actual);
        }
        /// <summary>
        ///Una prueba de ValidDate
        ///</summary>
        [TestMethod()]
        public void ValidDateTestFALSEWhenCheckOutYearIsSmaller()
        {
            DateTime check = new DateTime(2020, 04, 01); // TODO: Inicializar en un valor adecuado
            DateTime checkout = new DateTime(2019, 04, 04); // TODO: Inicializar en un valor adecuado
            bool expected = false; // TODO: Inicializar en un valor adecuado
            bool actual;
            actual = BookingManager.ValidDate(check, checkout);
            Assert.AreEqual(expected, actual);
        }

        /// <summary>
        ///Una prueba de BookARoom
        ///</summary>
        [TestMethod()]
        [ExpectedException(typeof(ArgumentException))]
        public void BookARoomTestWhenBookingIsNullReturnsAnException()
        {
            Booking bookingRoom = null; // TODO: Inicializar en un valor adecuado
            BookingManager.BookARoom(bookingRoom);
        }

        /// <summary>
        ///Una prueba de BookARoom
        ///</summary>
        [TestMethod()]
        public void BookARoomTestWhenBookingIsCorrectReturnsTrue()
        {
            Room room = new Room(6000, "a2010");
            Booking bookingRoom = new Booking(DateTime.Today, DateTime.Today.AddDays(1), room); // TODO: Inicializar en un valor adecuado
            bool expected = true; // TODO: Inicializar en un valor adecuado
            bool actual;
            actual = BookingManager.BookARoom(bookingRoom);
            Assert.AreEqual(expected, actual);
        }

        /// <summary>
        ///Una prueba de DeleteBooking
        ///</summary>
        [TestMethod()]
        [ExpectedException(typeof(ArgumentException))]
        public void DeleteBookingTestReturnsExceptionWhenBookingRoomIsNull()
        {
            Booking book = null; // TODO: Inicializar en un valor adecuado
            BookingManager.DeleteBooking(book);
        }

        /// <summary>
        ///Una prueba de DeleteBooking
        ///</summary>
        [TestMethod()]
        [ExpectedException(typeof(ArgumentException))]
        public void DeleteBookingTestReturnsExceptionWhenTheBookedRoomNotExists()
        {
            Random rand = new Random(DateTime.Now.Millisecond);
            Room room = new Room(rand.Next(int.MaxValue), "a" + rand.Next(int.MaxValue));
            Booking bookingRoom = new Booking(DateTime.Today, DateTime.Today.AddDays(1), room);// TODO: Inicializar en un valor adecuado
            bool expected = true; // TODO: Inicializar en un valor adecuado
            bool actual;
            actual = BookingManager.DeleteBooking(bookingRoom);
            Assert.AreEqual(expected, actual);
        }

        /// <summary>
        ///Una prueba de DeleteBooking
        ///</summary>
        [TestMethod()]
        public void DeleteBookingTestReturnsTrueWhenThereIsABookedRoomToDelete()
        {
            Room room = new Room(60000, "a2010");
            Booking bookingRoom = new Booking(DateTime.Today, DateTime.Today.AddDays(1), room);// TODO: Inicializar en un valor adecuado
            BookingManager.BookARoom(bookingRoom);
            bool expected = true; // TODO: Inicializar en un valor adecuado
            bool actual;
            actual = BookingManager.DeleteBooking(bookingRoom);
            Assert.AreEqual(expected, actual);
        }

        /// <summary>
        ///Una prueba de SearchByTypeAndDate
        ///</summary>
        [TestMethod()]
        [ExpectedException(typeof(ArgumentException))]
        public void SearchByTypeAndDateTest()
        {
            Booking book = null; // TODO: Inicializar en un valor adecuado
            BookingManager.SearchByTypeAndDate(book);
        }

        /// <summary>
        ///Una prueba de SearchByTypeAndDate
        ///</summary>
        [TestMethod()]
        public void SearchByTypeAndDateTestWhenIsNotNull()
        {
            Booking bookingRoom = new Booking(DateTime.Today, DateTime.Today.AddDays(1), 1);
            Collection<Room> actual;
            actual = BookingManager.SearchByTypeAndDate(bookingRoom);
            //Assert.IsNotNull(actual);
        }

        /// <summary>
        ///Una prueba de GetAllRoomsAvailable
        ///</summary>
        [TestMethod()]
        [ExpectedException(typeof(ArgumentException))]
        public void GetAllRoomsAvailableTestWhenRoomsListIsNullReturnsAnException()
        {
            DataGridView rooms = new DataGridView(); // TODO: Inicializar en un valor adecuado
            Collection<Room> roomsList = null; // TODO: Inicializar en un valor adecuado
            BookingManager.GetAllRoomsAvailable(rooms, roomsList);
        }
        /// <summary>
        ///Una prueba de GetAllRoomsAvailable
        ///</summary>
        [TestMethod()]
        [ExpectedException(typeof(ArgumentException))]
        public void GetAllRoomsAvailableTestWhenDataGridIsNullReturnsAnException()
        {
            DataGridView rooms = null; // TODO: Inicializar en un valor adecuado   
            Collection<Room> roomsList = new Collection<Room>(); // TODO: Inicializar en un valor adecuado
            roomsList.Add(new Room("a"));
            roomsList.Add(new Room("b"));
            BookingManager.GetAllRoomsAvailable(rooms, roomsList);
        }

        /// <summary>
        ///Una prueba de GetAllRoomsAvailable
        ///</summary>
        [TestMethod()]
        public void GetAllRoomsAvailableTest()
        {
            DataGridView rooms = new DataGridView(); // TODO: Inicializar en un valor adecuado
            DataGridViewTextBoxColumn idRoom = new DataGridViewTextBoxColumn();
            DataGridViewTextBoxColumn roomName = new DataGridViewTextBoxColumn();
            idRoom.Name = "idRoom";
            roomName.Name = "roomName";
            rooms.Columns.AddRange(new DataGridViewColumn[] { idRoom, roomName });
            Collection<Room> roomsList = new Collection<Room>(); // TODO: Inicializar en un valor adecuado
            roomsList.Add(new Room(1, "a"));
            roomsList.Add(new Room(2, "b"));
            BookingManager.GetAllRoomsAvailable(rooms, roomsList);
            Assert.IsNotNull(rooms);
        }
        /// <summary>
        ///Una prueba de SearchAllBookedRoomsByType
        ///</summary>
        [TestMethod()]
        [ExpectedException(typeof(ArgumentException))]
        public void SearchAllBookedRoomsByTypeTestWhenDataGridIsNullReturnsAnException()
        {
            DataGridView rooms = null; // TODO: Inicializar en un valor adecuado
            int idTypeOfRoom = 1; // TODO: Inicializar en un valor adecuado
            BookingManager.SearchAllBookedRoomsByType(rooms, idTypeOfRoom);
        }
        /// <summary>
        ///Una prueba de SearchAllBookedRoomsByType
        ///</summary>
        [TestMethod()]
        [ExpectedException(typeof(ArgumentException))]
        public void SearchAllBookedRoomsByTypeTestWhenIdIsZeroReturnsAnException()
        {
            DataGridView rooms = new DataGridView(); // TODO: Inicializar en un valor adecuado
            int idTypeOfRoom = 0; // TODO: Inicializar en un valor adecuado
            BookingManager.SearchAllBookedRoomsByType(rooms, idTypeOfRoom);
        }

        /// <summary>
        ///Una prueba de SearchAllBookedRoomsByType
        ///</summary>
        [TestMethod()]
        public void SearchAllBookedRoomsByTypeTestWhenIdNotExistsReturnsFalse()
        {
            Random rand = new Random(DateTime.Now.Millisecond);
            DataGridView rooms = new DataGridView(); // TODO: Inicializar en un valor adecuado
            int idTypeOfRoom = rand.Next(154256); // TODO: Inicializar en un valor adecuado
            bool expected = false;
            bool actual;
            actual = BookingManager.SearchAllBookedRoomsByType(rooms, idTypeOfRoom);
            Assert.AreEqual(expected, actual);
        }

        /// <summary>
        ///Una prueba de SearchAllBookedRoomsByDate
        ///</summary>
        [TestMethod()]
        [ExpectedException(typeof(ArgumentException))]
        public void SearchAllBookedRoomsByDateTestWhenDataGridIsNullReturnsAnException()
        {
            DataGridView resultDataGridView = null; // TODO: Inicializar en un valor adecuado
            DateTime checkDate = DateTime.Today; // TODO: Inicializar en un valor adecuado
            DateTime checkoutDate = DateTime.Today.AddDays(1); // TODO: Inicializar en un valor adecuado
            BookingManager.SearchAllBookedRoomsByDate(resultDataGridView, checkDate, checkoutDate);
        }
        /// <summary>
        ///Una prueba de SearchAllBookedRoomsByDate
        ///</summary>
        [TestMethod()]
        [ExpectedException(typeof(ArgumentException))]
        public void SearchAllBookedRoomsByDateTestWhenCheckInIsNullReturnsAnException()
        {
            DataGridView resultDataGridView = new DataGridView(); // TODO: Inicializar en un valor adecuado
            DateTime checkDate = new DateTime(); // TODO: Inicializar en un valor adecuado
            DateTime checkoutDate = DateTime.Today.AddDays(1); // TODO: Inicializar en un valor adecuado
            BookingManager.SearchAllBookedRoomsByDate(resultDataGridView, checkDate, checkoutDate);
        }

        ///// <summary>
        /////Una prueba de SearchAllBookedRoomsByDate
        /////</summary>
        //[TestMethod()]
        //[ExpectedException(typeof(ArgumentException))]
        //public void SearchAllBookedRoomsByDateTestWhenCheckOutIsNullReturnsAnException()
        //{
        //    DataGridView resultDataGridView = new DataGridView(); // TODO: Inicializar en un valor adecuado
        //    DateTime checkDate = DateTime.Today; // TODO: Inicializar en un valor adecuado
        //    DateTime checkoutDate = new DateTime(); // TODO: Inicializar en un valor adecuado
        //    BookingManager.SearchAllBookedRoomsByDate(resultDataGridView, checkDate, checkoutDate);

        //}

        ///// <summary>
        /////Una prueba de SearchAllBookedRoomsByDate
        /////</summary>
        //[TestMethod()]
        //public void SearchAllBookedRoomsByDateTest()
        //{
        //    DataGridView resultDataGridView = new DataGridView(); // TODO: Inicializar en un valor adecuado
        //    DateTime checkDate = new DateTime(3010, 12, 05); // TODO: Inicializar en un valor adecuado
        //    DateTime checkoutDate = new DateTime(3010, 12, 10); // TODO: Inicializar en un valor adecuado
        //    bool expected = false; // TODO: Inicializar en un valor adecuado
        //    bool actual;
        //    actual = BookingManager.SearchAllBookedRoomsByDate(resultDataGridView, checkDate, checkoutDate);
        //    Assert.AreEqual(expected, actual);
        //}
    }
}
